package demo1;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 使用Spring来管理项目中的类
 * IOC(反转控制 Inverse Of Control)
 * 意思是将原本由我们编写的程序自行控制要实例化的类，做初始化等动作的事情转交给由Spring来完成
 * 将初始化的控制权反过来交给Spring容器管理的思想为IOC
 * 这样做的好处:繁琐的对象初始化操作可以由容器完成，让程序员更专注编写业务逻辑代码
 *            并且类与类之间的依赖关系由Spring容器管理，也无需我们再编写大量的反射代码。
 */
public class Demo {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //需求:使用User类的sayHello方法

        //最开始我们的传统写法
        //优点:简单，明了
        //缺点:代码写死了，将来换成其他类，这里需要修改代码
        /*
            基本概念:
            当一个类实现逻辑时需要调用另一个类的方法功能，那么可以说当前类与另一个存在"依赖关系"
            比如:A类逻辑中需要调用B类的方法完成功能，则A类依赖B类
            如果在A类中直接将B类的实例化写在A类的逻辑中，那么此时可以说:A与B是"强耦合"
         */
        User user = new User();
        user.sayHello();

        //后来:反射机制
        //优点:调用者与被调用不是写死在逻辑中，耦合关系被打断
        //缺点:编写大量的反射代码，在业务逻辑中参杂了大量的反射
        Class cls = Class.forName("demo1.User");
        User user1 = (User)cls.newInstance();
        user1.sayHello();

        //现在:Spring容器
        //优点:不在需要编写大量的反射代码来维护对象的创建等工作
        //缺点:没什么缺点
        //创建Spring提供的AnnotationConfigApplicationContext时需要指定管理的包
        //该包下所有类(被Spring提供的注解标注的类)和子孙包中的所有类(注解同理)都会被管理
        AnnotationConfigApplicationContext  context
                = new AnnotationConfigApplicationContext("demo1");
        User user2 = context.getBean(User.class);
        user2.sayHello();
    }
}








